package com.sicong.admin.util;

import com.sicong.admin.dto.PermissionNode;
import com.sicong.admin.dto.TreeNode;
import com.sicong.admin.entity.Permission;

import java.util.ArrayList;
import java.util.List;

/**
 * @author chenww
 * @date 2021-1-20
 */
public class TreeUtil {

    /**
     * 构建权限菜单树
     * @param permissions 权限列表
     * @param root        根节点Id
     * @return
     */
    public static List<PermissionNode> buildTree(List<Permission> permissions, Long root) {
        List<PermissionNode> tree = new ArrayList<>();
        PermissionNode permissionNode;
        for (Permission permission : permissions) {
            permissionNode = new PermissionNode();
            permissionNode.setId(permission.getId());
            permissionNode.setPid(permission.getPid());
            permissionNode.setPermission(permission.getPermission());
            permissionNode.setPermissionName(permission.getPermissionName());
            permissionNode.setPath(permission.getPath());
            permissionNode.setComponent(permission.getComponent());
            permissionNode.setIcon(permission.getIcon());
            permissionNode.setSort(permission.getSort());
            permissionNode.setKeepAlive(permission.getKeepAlive());
            permissionNode.setStatus(permission.getStatus());
            permissionNode.setType(permission.getType());
            tree.add(permissionNode);
        }
        return TreeUtil.build(tree,root);
    }

    /**
     * 建树
     * @param permissionNodes 权限节点列表
     * @param root            根节点id
     * @return                权限菜单树
     */
    public static <T extends TreeNode> List<T> build(List<T> permissionNodes, Long root) {
        List<T> tree = new ArrayList<>();
        for (T node : permissionNodes) {
            if (root.equals(node.getPid())) {
                tree.add(node);
            }
            for (T n : permissionNodes) {
                if (node.getId().equals(n.getPid())) {
                    if (node.getChildren() == null) {
                        node.setChildren(new ArrayList<>());
                    }
                    node.getChildren().add(n);
                }
            }
        }
        return tree;
    }

}
